data.table里面的fread函数和fwrite函数是我用过最好的I/O函数,f(fast)简明扼要地说明了data.table的读写速度一骑绝尘。
除了快,它还安全。普通的read.csv函数,读入全局空间之后,字符变量常常被转换为因子型数据(factor),这种数据类型特别容易出错,本意是想着节省内存空间,实际上对于小量数据来说反而增加了负担,打印出的一小部分因子数据也会自带冗余的levels信息。最麻烦的还是在于数据索引比较时(比如merge,is.identical)时,一列是因子型,一列是字符型,你无法预知会发生什么幺蛾子。最稳妥的方式就是只使用字符型一个数据类型,这个习惯也容易迁移到其他语言当中去。如果你使用fread函数的话,就没有这个问题,甚至参数什么的都帮你自动取了,你不需要明确指出要不要表头,分隔符是什么,它会在读取的过程中逐步地判断数据类型应该取什么,自己调整。
但是这个函数有个bug,目前用的最新1.11.4版本也没有解决这个问题,stack overflow相关帖见 fread issue with integer64,很不幸,目前没有人给出解决办法,这个问题也上传到github上面了,详见fread(integer64 = “double”) not working for some data
在座各位都是学过VB的人,应该知道VB是动态语言,R是静态语言,静态语言中赋值给变量的时候不用事先声明,使用的时候才确定变量类型,这样写代码的时候很爽,可是少了数据类型严格的定义,除了每次计算前都要判断数据类型造成速度慢之外,存储空间也大,数据类型之间的转换更加是一件危险的事情,比如原来应该是double的数据类型,你使用了int,那么2^31以上的数字你就要当心你的变量装不下了。为了充分发挥R的浪费内存的特性,我想把所有的数值型变量的数据类型级别开到最大,写了这么一段函数:
|
|
这个函数寥寥几行,却散发着本人一身老油条的气息。拿去稍加修改就可以读取一个文件夹下所有具有相同数据格式csv文件,并且合并到一个数据框里面。读数据都可以使用lapply,我深深地被自己震撼到了。然而integer64="double"
这个参数却没有起到作用,让我的数据出现很多异常。让我十分的郁闷,我的数据是要导入到sql server里面的,sql server里面更改数据的工作量很大,并且是高危工作。还好我找到了一个补救办法:
|
|
使用colClasses参数强制定义某一类型下的所有列变量,只是这个参数的设置就稍微工作量大了一点,这一想法来自stack overflow。会不会出现其他问题呢,再观望一下吧。建议还没修复这个bug的时候,使用这个函数的时候library(bit64)一下,否则可能出现读入超过2^32的整数会变成无穷小量情况,这就是另一个谜了。
hahaha,我在上面的帖子还看到任坤大佬,出镜率贼高,厦大毕业的硕士,在上海某私募(上海明汯投资)做量化,写过几个R包比如Rlist,我没用过感觉不太好用,可能是他处理数据的时候经常使用list做数据的载体吧。